Skip to content

docs(pm): arm-time drift re-measurement becomes standing in landing-operations B - #19697

Merged
huangyiirene merged 2 commits into
mainfrom
claude/issue-19244-arm-time-drift-remeasure
Sep 22, 2026
Merged

huangyiirene merged 2 commits into
mainfrom
claude/issue-19244-arm-time-drift-remeasure

Conversation

@huangyiirene

Copy link
Copy Markdown
Collaborator

Part of #19244

Remainder item ① of the card, carrying the pure-regeneration ruling's fourth bullet into the landing protocol: the generated-artefact drift reading is taken in the SAME act that arms auto-merge, and an earlier zero is never reused.

What changed — one line in, one line out, net 0

.claude/skills/pm-dispatch/references/landing-operations.md sits at its ratchet ceiling (69 / 69, headroom 0). The ceiling in scripts/pm/check-skill-line-ratchet.mjs is not touched; the new rule is funded by retiring a provable duplicate in the same file. The file is 69 lines before and after.

In — section B, line 30 (115 bytes, under the gate's 120-byte cap):

- 挂 auto-merge 的同一动作里重测生成物漂移,⛔ 不复用更早的零;非零 ⇒ 按 A 的固定序。

Out — section A's former tail, line 15:

- ⛔ 不得要求 `baseRev == merge-base`。

Placement, and the candidate that was rejected

The rule governs the arm act — B:21 「绿即转 ready + 挂 auto-merge」 — so it sits directly under B's existing arm-act re-read, B:29 「再读 mergeable_state:dirty ⇒ 先 merge origin/main 再挂;生成物在面上按 A 的固定序」, which already routes a generated-artefact hit into A's fixed sequence. The arm act now carries both of its readings on adjacent lines, and the new line's consequence clause reuses the vocabulary of the line above it.

Section A's tail was the other candidate and was rejected on measurement: A is the sync-and-regenerate procedure — what to DO once drift is found — while the ruled bullet is about WHEN the reading is taken. A rule about the timing of a reading placed in the procedure that consumes it would have to name the arm act anyway, at more bytes and further from B:21.

Why the retired line is a duplicate and not a rule

Four legs, all on this tree:

  1. The surviving neighbour states it. A:14 reads 「baseRev 允许滞后,是一行提示不是错误;⛔ 禁为凑相等手改锚点。」 — a lagging baseRev is permitted and is not an error, and hand-editing the anchor to reach 相等 is banned. A rule that permits the inequality and calls it a non-error already forbids demanding the equality, which is the whole content of the retired line.
  2. They were ONE sentence. Until the rules-only rewrite (2a7feb96d) the region was a single prose sentence: 「…baseRev 允许滞后(一行提示,不是错误);⛔ 禁为凑「相等」手改锚点,⛔ 不得要求 baseRev == merge-base。」 The rewrite split a comma-clause of A:14's own clause into its own bullet — the same 相等, counted twice.
  3. Its once-distinct content is held by A:13. The clause used to end 「—— 那个等式不是任何门的判据」 (that equality is not any gate's criterion); that tail was deleted earlier, by a6d8ae9bf, and the fact now lives at A:13 「锚点断言的正确措辞:断言 pnpm --filter @objectstack/spec check:authorable-surface 绿即可。」 — the gate's green IS the criterion, so the equality is not.
  4. No gate reads the equality. grep -rn 'baseRev' scripts/ finds it only in scripts/regen-artifacts.mjs comments and the docs-audit helpers; no gate compares baseRev to a merge base, so retiring the line detaches no mechanism. The corpus's only other copy of the fact, .claude/agents/os-dev.md:195, is untouched and says the same thing.

Nothing else in the tree changed.

Gates

Derived with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (no paths — the script took the change set from the merge base itself) and reconciled with --ran. Exit codes captured before any pipe, per cmd redirected-to-a-file; EXIT=$?.

Union re-run on the final head 859c3df37 (the merge of origin/main 40626bdca is in it, so the ratchet reading below is the one that counts):

dispatch-gates --ran: 17 derived famil(ies) accounted for — 17 run,
0 NOT-MEASURED (a DERIVED zero — all 17 recorded an exit code and none of them is 3).

Named families, verdict lines as the gates printed them:

gate exit verdict
pnpm check:pm-skill-ratchet 0 landing-operations.md is 69 lines (ceiling 69; headroom 0); widest table row 0 bytes (pin 0)
pnpm check:pm-skill-id-lint 0 30 file(s) clean (pattern /#[0-9]{3,}/g)
pnpm check:skill-frame-sync 0 one declared copy coherent; 77 markdown files scanned for undeclared copies
pnpm check:pm-governed-prose 0 2 instruction surface(s) name all 6 registered governed surfaces
pnpm check:doc-authoring 0 403 files clean; 44 published skill files clean; 16120 customer-facing strings clean
pnpm check:nul-bytes 0 OK (scanned 9202 text file(s) … no raw ASCII control bytes)
node scripts/check-skills-token-ratchet.mjs 0 34 authored bundle file(s) within their ceilings
pnpm check:pm-governed-merges 0 self-test green

The other nine derived families (check-closing-keyword-parity and its self-test, check-comment-mask-corpus, check-harness-current --self-test, check:doc-formula-expressions, check:agent-test-spelling, check:cross-package-test-inputs, check:driver-memory-census, check:gitlink-declared, check:refd-timer-probe, check:watch-hint-literal) each exited 0 on the same head. check:pm-settings-deny-roster was run too although its verdict is silent-by-roster: the derivation flags its roster as living under .claude/, one of this PR's paths, where silence is evidence in neither direction.

Two families first came back exit 3, PREREQUISITE NOT MET — nothing measured, and are recorded here as the re-runs they became, never as readings: check:doc-authoring before pnpm install in this fresh worktree, and check:doc-formula-expressions before pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint (through the shared verify lock: VERDICT command-exit 0 · held the lock 157s). Both are exit 0 above.

node scripts/pm/check-governed-merges.mjs --pr on this PR is reported in the dev report on the card.

Landing

  • Governed surface, Tier S (.claude/**): opened as draft and it stays draft — the owning seat lands it on a contract-tier review of record. No seat approval, no queue, no auto-merge from here.
  • Every governed path is under references/, so this is fact-layer text and no 维护者速读 section is owed.
  • No changeset: .claude/** is in no package's published files[] — it ships to nobody — so skip-changeset.

Acceptance notes

  • Remainder items ② (the post-merge audit's 「for the PR's CURRENT head」 prose) and ③ (the queue guard rendering a refused carry without naming the refusing path) stay on the card and are untouched here, as dispatched.
  • No out-of-scope findings: the file's other 68 lines were read for further duplicates only as far as needed to fund this one line, and nothing else was changed.

Generated by Claude Code

…perations B

The ruled fourth bullet of the pure-regeneration ruling: the generated-artefact
drift reading is taken in the SAME act that arms auto-merge, and an earlier zero
is never reused — a zero that was true when read goes false the moment a sibling
PR lands, which is how a PASSed PR gets kicked out of the queue two minutes after
it was armed. A non-zero reading routes back to section A's fixed sequence.

Placed in B beside the existing arm-act re-read of `mergeable_state`, which
already routes a generated-artefact hit into A's sequence: both readings of the
arm act now sit adjacent. Section A is what to DO once drift is found, not when
to measure it.

Paid at the ratchet ceiling (69 / 69, headroom 0) by retiring the duplicate
`⛔ 不得要求 baseRev == merge-base`: it and the line above it were ONE sentence
until the rules-only rewrite split a comma-clause into its own bullet, the
surviving line already states that a lagging `baseRev` is allowed and is not an
error (so the equality cannot be required) and names the same 相等, and the only
content the retired line ever had of its own — that the equality is not any
gate's criterion — is held by the line naming `check:authorable-surface` green as
the criterion. No gate reads the equality.

Claude-Session: https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc
Co-authored-by: Claude <noreply@anthropic.com>
@huangyiirene huangyiirene added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 22, 2026 — with Claude
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Sep 22, 2026

Copy link
Copy Markdown
Collaborator Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 859c3df37d746a64c70467b74a1a8fc78150e86d

① Derived judgments

Rendered in-seat by the skills seat 1 session at the served tier the maintainer named on this date (the fable tier word at get_sessionexternal_metadata.last_served_model; ruling record 5771798588 — and since PR #19684 the constant on origin/main names it too). The contract is ruling 5749024878's fourth bullet: 「Arm-time re-measurement of drift (the practice in 5747600165) becomes standing: ⛔ no reuse of an earlier zero.」

  • (a) The diff is one rule line for one retired line — right. git diff 40626bdca 859c3df37 is references/landing-operations.md +1 / −1: added at §B :30 「- 挂 auto-merge 的同一动作里重测生成物漂移,⛔ 不复用更早的零;非零 ⇒ 按 A 的固定序。」 (115 bytes, under the 120-byte cap), retired at §A :15 「- ⛔ 不得要求 baseRev == merge-base。」. The merge commit 859c3df37 carries 0 of the PR's paths (main's side only: #19688's driver-sql files and a changeset).
  • (b) The line states the ruling — right. Three parts, all present: the reading is taken in the SAME act that arms auto-merge (「挂 auto-merge 的同一动作里重测」), an earlier zero is never reused (「⛔ 不复用更早的零」), a non-zero reading routes back to §A's fixed sequence (「非零 ⇒ 按 A 的固定序」). The subject is generated-artefact drift (「生成物漂移」), the thing 5747600165 measured (merge=os-regen paths moved on origin/main since the merge base).
  • (c) Placement — right, and argued. §B :21 is the arm act (「绿即转 ready + 挂 auto-merge」) and §B :29 (old :30) is the existing arm-act re-read (「再读 mergeable_state … 生成物在面上按 A 的固定序」); the new line sits directly under it and reuses its consequence vocabulary, so the arm act's two readings are adjacent. §A is what to DO once drift is found, not when to measure; a timing rule there would have to name the arm act anyway.
  • (d) The retired line is a provable duplicate — right, measured by this seat. git show 2a7feb96d -- …landing-operations.md (the 2026-09-05 rules-only rewrite) shows the region was ONE sentence — 「…baseRev 允许滞后(一行提示,不是错误);⛔ 禁为凑「相等」手改锚点,⛔ 不得要求 baseRev == merge-base。」 — split into :14 and :15; :14 「baseRev 允许滞后,是一行提示不是错误;⛔ 禁为凑相等手改锚点。」 permits the lag, calls it a non-error and names the same 相等, which already forbids demanding the equality. git grep baseRev origin/main -- scripts outside regen-artifacts.mjs's comments finds no gate that compares baseRev to a merge base, so the retirement detaches no mechanism; .claude/agents/os-dev.md:195 carries the same fact unchanged. The rule is counted once now instead of twice.
  • (e) The ratchet — right. 69 / 69 before and after, headroom 0; check-skill-line-ratchet.mjs:1147 untouched (⛔ not raised — a maintainer-floor item); this seat's run on a clean worktree at this head: check:pm-skill-ratchet exit 0 with the file at 69 lines, widest table row 0.
  • (f) Nothing narrowed or widened. The ruling's other bullets (the exception, the Regen-provenance: line, the label not re-hung) landed in PR fix(pm): a pure-regeneration head move keeps the contract-review record, decided on the committed trees #19634; remainder items ② (the retired post-merge audit's 「CURRENT head」 prose) and ③ (the queue guard's refused-path rendering) are untouched here and stay on the card, flagged in Release: 5771229979 for re-reading against Retire the in-seat clause-② contract review — the rule, its gate label, and the 9k-line checker's gate role #19061 B.
  • (g) Gates — measured by this seat at this head. check:pm-skill-ratchet, check:pm-skill-id-lint, check:skill-frame-sync, check:pm-governed-prose, check:doc-authoring, check:nul-bytes, check-skills-token-ratchet.mjs — all exit 0; check-governed-merges.mjs --pr 19697 exit 3 — GOVERNED, Tier S, one path on the register, 2 lines. The dev's 17-family derivation and --ran reconciliation (0 NOT-MEASURED) at this head read as reported; two first attempts at exit 3 PREREQUISITE NOT MET were recorded as not measured and re-run green after the install and the prerequisite build.

② Semver level

None — no release. .claude/** is in no package's files[]; skip-changeset is the correct carrier (written through label-write.mjs with read-back; size/xs is the labeler's).

③ Boundary flags

  • A build ran for a docs-only diff (turbo run build --filter=@objectstack/formula --filter=@objectstack/lint, through the shared verify lock) solely to clear check:doc-formula-expressions' declared prerequisite — declared, harmless, accepted.
  • pnpm install after the first gate batch — the dependency-free gates ran unchanged; every reported reading is the post-install run. Accepted.
  • The maintainer quick-read is present although not owed for a references/**-only surface — harmless.
  • CI at this head: Lint & Repo Gates and Type Check · workspace were in_progress at the seat's read; the seat enqueues only on all green and check-expected-skips --pr 19697 exit 0.
  • The card stays open (Part of #19244): items ② and ③ remain; ② is prose in a retired audit tool (ruling 🔗 Broken links detected in documentation #202) and may fall with Retire the in-seat clause-② contract review — the rule, its gate label, and the 9k-line checker's gate role #19061 step ③ rather than be built.

Implemented-by: claude/issue-19244-arm-time-drift-remeasure
Reviewed-by: session_01Wnstp2kTth7sGXfr8fXypc

VERDICT: PASS


Generated by Claude Code

@huangyiirene
huangyiirene marked this pull request as ready for review September 22, 2026 09:22
@huangyiirene
huangyiirene added this pull request to the merge queue Sep 22, 2026
Merged via the queue into main with commit 1d41aa8 Sep 22, 2026
32 checks passed
@huangyiirene
huangyiirene deleted the claude/issue-19244-arm-time-drift-remeasure branch September 22, 2026 09:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants